package cn.wolfcode.luowowo.website.controller;

import cn.wolfcode.luowowo.cache.prefix.UserInfoKeyPrefix;
import cn.wolfcode.luowowo.cache.service.IUserInfoRedisService;
import cn.wolfcode.luowowo.member.domain.UserInfo;
import cn.wolfcode.luowowo.website.annotation.RequiredLogin;
import cn.wolfcode.luowowo.website.util.CookieUtil;

import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.invoke.MethodHandle;

/**
 * 登录器拦截器：
 * 继承的方式：extends HandlerInterceptorAdaptor
 * 实现的方式：implements HandlerInterceptor
 *
 *HandlerInterceptorAdaptor 适配器模式：以前jDk版本为了让用户不去实现 那些HandlerInterceptor中没有默认实现的方法，出现的适配器
 *
 *HandlerInterceptor：1.8之后对于该接口的方法都有默认实现，也就是说1.8版本之后就不需要去实现那些不用的接口方法，这是因为default中的默认实现
 */


public class CheckLoginInterceptor extends HandlerInterceptorAdapter{
    @Reference
    private IUserInfoRedisService userInfoRedisService;

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //首先获取从浏览器传递过来的cookie，写一个工具类
        Cookie cookie = CookieUtil.getCookie(request, UserInfoKeyPrefix.USER_INFO_COOKIE_NAME);

        UserInfo userInfo= null;
        if(cookie != null){
            userInfoRedisService.getUserInfoByToken(UserInfoKeyPrefix.USER_INFO_TOKEN,cookie.getValue());
        }
        //动态请求处理
        //HanlderMethod：Springmvc封装动态请求映射方法的对象
        //而对于静态资源请求使用的是另外一种处理对象
        if(handler instanceof MethodHandle){
            HandlerMethod hm = (HandlerMethod) handler;
            if (hm.hasMethodAnnotation(RequiredLogin.class)) {
                if(userInfo == null){
                    response.sendRedirect("/login.html");
                    return false;
                }

            }
        }
        return true;
    }
}
